import java.util.*;

/**
 * @author Rafal Uranek i Artur Wojtas
 * Technologia Programowania
 * Lista 2 - Poker
 */
class Start extends Thread{
    
    Table table;
    Controller controller;
    
    int iloscGraczy;
    int iloscBotow;
    int poczatkowaIlosc;
    int wpisowe;

    int numerGracza;
    int zagranie;
    int stawkaWpisana;
    int next = 0;
    String doWymiany ="";

    Start() { /*controller = new Controller();*/ }
    
    void getController(Controller controller) { this.controller = controller; }
    
    String createGame(int iloscGraczy,int iloscBotow,int poczatkowaIlosc,int wpisowe)
    {
     if( iloscGraczy >= 2 && iloscGraczy <= 4 && poczatkowaIlosc > 0 && wpisowe > 0 && iloscBotow <= 4 )
     {
        table = new Table(iloscGraczy,iloscBotow,poczatkowaIlosc,wpisowe);
        table.croupier.Auction(poczatkowaIlosc,iloscGraczy);      
 
        this.iloscGraczy = iloscGraczy;
        this.iloscBotow = iloscBotow;
        this.poczatkowaIlosc = poczatkowaIlosc;
        this.wpisowe = wpisowe;
        //startGame();
        return "Stworzono gre!";     
     }
     else
         return "Blad przy Tworzeniu gry!";
    } 
    
    public void run(){

        int licznik = iloscGraczy;
        System.out.println(licznik);

        
        while( licznik > 1 )
        {
            int[][] wyniki = new int[5][5];
            
            table.tasujKarty();
            table.croupier.startAuction(wpisowe);     
            
            licznik = 0;
            for(int i = 0;i<iloscGraczy;i++){
                if(table.croupier.tokens[i].wGrze)
                    licznik = licznik + 1;
            }
            
            for(int i = 0;i<iloscGraczy;i++){
                controller.updateStolCash(table.croupier.naStole,table.croupier.najwyzsza);
                controller.updateCash(i, table.croupier.tokens[i].tokens);
            }
            
            if(licznik <= 1)
                break;
        
                for(int i = 0; i<(iloscGraczy-iloscBotow); i++ )
                {
                    zagranie = 0;
                    numerGracza = i;
                    next = 0;
                    doWymiany = "";
                    
                    if(table.croupier.tokens[i].wGrze)   
                     {
                         controller.numerGracza(i);
                         controller.showCards(table.croupier.playerCards,i);                // wypisanie kart graczowi (showFigure + showColor)
                         
                             table.croupier.stan = 0;
                             controller.Stan(table.croupier.sendStan());
                         
                             while(zagranie == 0)
                             {   
                                 try {
                                    Start.sleep(100);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                 // oczekiwanie na zagranie gracza
                             }
                             
                             table.croupier.stan = 4;
                             controller.Stan(table.croupier.sendStan());
                             controller.updateStolCash(table.croupier.naStole,table.croupier.najwyzsza);
                             controller.updateCash(i, table.croupier.tokens[i].tokens);
                             
                             while(doWymiany == "")
                             {
                                 try {
                                     Start.sleep(100);
                                 } catch (InterruptedException e) {
                                     e.printStackTrace();
                                 }
                                 //oczekiwanie na wymiane kart 
                             }
                             
                             table.gameH(i,doWymiany);
                             
                             controller.showCards(table.croupier.playerCards,i);                // wypisanie kart graczowi (showFigure + showColor)
                             while(next == 0)
                             {
                                 try {
                                     Start.sleep(100);
                                 } catch (InterruptedException e) {
                                     e.printStackTrace();
                                 }
                                 //oczekiwanie na wymiane kart 
                             }
                         }
                }
                
                for(int i = (iloscGraczy-iloscBotow) ; i<iloscGraczy; i++ )
                {   
                    if(table.croupier.tokens[i].wGrze)   
                    {
                        controller.showInfo(table.croupier.roundBot(i));
                        
                        controller.updateStolCash(table.croupier.naStole,table.croupier.najwyzsza);
                        controller.updateCash(i, table.croupier.tokens[i].tokens);
                        
                        table.gameB(i);
                    }    
                }
                if( table.croupier.all_in ) {}
                else
                {    
                    for(int i = 0; i<(iloscGraczy-iloscBotow); i++ )
                    {
                        zagranie = 0;
                        numerGracza = i;
                        controller.numerGracza(i);
                        
                        if(table.croupier.tokens[i].wGrze)   
                        {
                            controller.showCards(table.croupier.playerCards,i);                // wypisanie kart graczowi (showFigure + showColor)
                            
                            table.croupier.stan = 0;
                            controller.Stan(table.croupier.sendStan());
                        
                            while(zagranie == 0)
                            {   
                                try {
                                Start.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            } 
                                // oczekiwanie na zagranie gracza
                            }
                            controller.updateStolCash(table.croupier.naStole,table.croupier.najwyzsza);
                            controller.updateCash(i, table.croupier.tokens[i].tokens);
                        }
                }
       
                for(int i = (iloscGraczy-iloscBotow) ; i<iloscGraczy; i++ )
                {   
                    if(table.croupier.tokens[i].wGrze)   
                    {
                        controller.showInfo(table.croupier.roundBot(i));
                        controller.updateStolCash(table.croupier.naStole,table.croupier.najwyzsza);
                        controller.updateCash(i, table.croupier.tokens[i].tokens);
                    }    
                }

                for( int i = 0; i<iloscGraczy; i++ )
                {
                    if(table.croupier.tokens[i].wGrze )   
                    {    
                        // sprawdzanie wyniku
                        Card[] karty = new Card[5];
                        for(int j = 0; j<5; j++){
                            karty[j] = new Card(0,0);
                            karty[j].card[0] = table.croupier.playerCards[i][j].card[0];
                            karty[j].card[1] = table.croupier.playerCards[i][j].card[1];
                        }
                        int[] wynik = Wynik.cardCheck(karty);
       
                        for( int j = 0; j<5; j++ )
                        {
                        wyniki[i][j] = wynik[j];
                        }
                    }
                }
            }
                
            if(Wynik.whoWin(wyniki,iloscGraczy) != 0)
            {
                controller.showInfo("Wygral gracz: "+Integer.toString(Wynik.whoWin(wyniki,iloscGraczy)));
                table.croupier.endAuction(Wynik.whoWin(wyniki,iloscGraczy));
            }
            
            for(int i = 0;i<iloscGraczy;i++){
                controller.updateCash(i,table.croupier.tokens[i].tokens);
                controller.updateScore(i,table.croupier.tokens[i].liczbaZwyciestw);
            }
            
        }
        
       
    }
    

    public synchronized void setZagranie(int zagranie,int iloscKasy){
       
        String a = table.croupier.Round(numerGracza,zagranie,iloscKasy);
        
        controller.showInfo(a);
        
        if(a != "Blad wybranego zagrania!")
            this.zagranie = zagranie;
        else
            this.zagranie = 0;
        
    }
    public synchronized void setZagranieWymiana(String doWymiany){
        this.doWymiany = " " + doWymiany;
    }
    
    public synchronized void setNext(){
        this.next = 1;
    }
    
    /*
    public synchronized void test(){
        System.out.println("yolo");
    }*/

}
